home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / clang / ebksrc.zip / EB1.CPP < prev    next >
C/C++ Source or Header  |  1991-07-31  |  5KB  |  228 lines

  1. /*
  2.  
  3.     eb1.cpp
  4.     7-31-91
  5.     Electronic Book
  6.  
  7.  
  8.     Copyright 1991
  9.     John W. Small
  10.     All rights reserved
  11.  
  12.     Licensed users of FlexList may use and modify this
  13.     tool for use in their programs.
  14.  
  15.  
  16.     PSW / Power SoftWare
  17.     P.O. Box 10072
  18.     McLean, Virginia 22102 8072 USA
  19.  
  20.     Voice: (703) 759-3838
  21.     CIS: 73757,2233
  22.  
  23.  
  24.     Notes:  The Electronic Book was coded to demonstrate
  25.     the various uses of FlexList.
  26.  
  27.  
  28. */
  29.  
  30. #include <eb1.hpp>
  31. #include <ctype.h>
  32. #include <pcdir.hpp>
  33.  
  34.  
  35. char * parseLinks(const char * inOutLinks)
  36. {
  37.     static char buf[MAX_HYPER_LINE] = "";
  38.     static int i = 0;
  39.     int j;
  40.  
  41.     if (inOutLinks)  {
  42.         buf[i=0] ='\0';
  43.         for (j = 0; isspace(inOutLinks[j]); j++)
  44.             /* null statement */;
  45.         switch (inOutLinks[j++])  {
  46.         case HYPER_INLINKS_BEGIN:
  47.         case HYPER_OUTLINKS_BEGIN:
  48.             break;
  49.         default:
  50.             return (char *)0;
  51.         }
  52.         if (inOutLinks[j++] != HYPER_LINKS_DELIMIT)
  53.             return (char *)0;
  54.         if (strlen(&inOutLinks[j]) >= MAX_HYPER_LINE)
  55.             return (char *)0;
  56.         strcpy(buf,&inOutLinks[j]);
  57.     }
  58.     switch (buf[i])  {
  59.         case '\0':
  60.         case HYPER_INLINKS_END:
  61.         case HYPER_OUTLINKS_END:
  62.             buf[i=0] = '\0';
  63.             return (char *)0;
  64.     }
  65.     for (j = i; buf[i]; i++)
  66.         if (buf[i] == HYPER_LINKS_DELIMIT)
  67.             break;
  68.     if (buf[i])  {
  69.         buf[i++] = '\0';
  70.         return &buf[j];
  71.     }
  72.     buf[i=0] = '\0';
  73.     return (char *)0;
  74. }
  75.  
  76. char * extractLinksDup(const char *inOutLinks, int inOut)
  77. {
  78.     int i, j, l;
  79.     char *s, lbegin, lend;
  80.  
  81.  
  82.     if (!inOutLinks) return (char *)0;
  83.     for (i = 0; isspace(inOutLinks[i]); i++)
  84.         /* null statement */;
  85.     if (inOut)  {
  86.         lbegin = HYPER_INLINKS_BEGIN;
  87.         lend = HYPER_INLINKS_END;
  88.     }
  89.     else  {
  90.         lbegin = HYPER_OUTLINKS_BEGIN;
  91.         lend = HYPER_OUTLINKS_END;
  92.     }
  93.     if (inOutLinks[i] == lbegin &&
  94.         inOutLinks[i+1] == HYPER_LINKS_DELIMIT)
  95.         for (j = i + 2; inOutLinks[j]; j++)
  96.             if (inOutLinks[j] == HYPER_LINKS_DELIMIT
  97.                 && inOutLinks[j+1] == lend) {
  98.                 s = new char[l=j-i+3];
  99.                 if (s)  {
  100.                     strncpy(s,&inOutLinks[i],l);
  101.                     s[l-1] = '\0';
  102.                     return s;
  103.                 }
  104.             }
  105.     return (char *)0;
  106. }
  107.  
  108.  
  109. enum HYPER_TARGETS TargetParser::parse(const char *target)
  110. {
  111.     if (!target) return ttype;
  112.     reset();
  113.     if (strlen(target) >= MAX_HYPER_LINE)
  114.         return ttype;
  115.     strcpy(buf,target);
  116.     for (int i = 0; buf[i]; i++)
  117.         if (buf[i] == HYPER_TARGET_SPLIT)
  118.             break;
  119.     if (buf[i] == HYPER_TARGET_SPLIT)  {
  120.         buf[i] = '\0';
  121.         switch (buf[++i])  {
  122.         case HYPER_TARGET_SYSTEM:
  123.             if (buf[++i])  {
  124.                 ttype = FAR_SYSTEM;
  125.                 pm = &buf[i];
  126.             }
  127.             break;
  128.         case HYPER_TARGET_SPAWN:
  129.             if (buf[++i])  {
  130.                 ttype = FAR_SPAWN;
  131.                 pm = &buf[i];
  132.             }
  133.             break;
  134.         case HYPER_LINKS_DELIMIT:
  135.         case '\0':
  136.             break;
  137.         default:
  138.             if (i > 1)  {
  139.                 ttype = FAR_TOPIC;
  140.                 tp = buf;
  141.             }
  142.             else
  143.                 ttype = FAR_DEFAULT;
  144.             pm = &buf[i];
  145.             break;
  146.         }
  147.     }
  148.     else if (i)  {
  149.         ttype = NEAR_TOPIC;
  150.         tp = buf;
  151.     }
  152.     else
  153.         ttype = NEAR_DEFAULT;
  154.     return ttype;
  155. }
  156.  
  157.  
  158. HyperTextTarget::HyperTextTarget(const char *fname,
  159.     const char *topic, unsigned startColumn,
  160.     unsigned startRow, unsigned cursorColumn,
  161.     unsigned cursorRow)
  162. {
  163.     constructOK = 0;
  164.     this->fname = (char *) 0;
  165.     this->topic = (char *) 0;
  166.     if (!fname) return;
  167.     if ((this->fname = strdup(fnexpand(fndefault(fname,
  168.         (char *)0,(char *)0,(char *)0,".htx"))))
  169.         == (char *) 0) return;
  170.     if (topic) if ((this->topic = strdup(topic))
  171.         == (char *) 0)  {
  172.         delete this->fname;
  173.         this->fname = (char *) 0;
  174.         return;
  175.     }
  176.     this->startColumn = startColumn;
  177.     this->startRow = startRow;
  178.     this->cursorColumn = cursorColumn;
  179.     this->cursorRow = cursorRow;
  180.     constructOK = 1;
  181. }
  182.  
  183. int HyperTextTarget::setView(unsigned startColumn,
  184.     unsigned startRow, unsigned cursorColumn,
  185.     unsigned cursorRow)
  186. {
  187.     this->startColumn = startColumn;
  188.     this->startRow = startRow;
  189.     this->cursorColumn = cursorColumn;
  190.     this->cursorRow = cursorRow;
  191.     return 1;
  192. }
  193.  
  194.  
  195. int   HyperStack::FNdestruct(void *ND, void *D)
  196. {
  197.     HyperTextTargeT HTT = (HyperTextTargeT) ND;
  198.     if (D) return 0;
  199.     HTT->HyperTextTarget::~HyperTextTarget();
  200.     return 1;
  201. }
  202.  
  203. HyperTextTargeT HyperStack::pushTarget(const char *fname,
  204.     const char *topic)
  205. {
  206.     HyperTextTargeT HTT;
  207.     void *getter = &getter; // gimmick for FNnew()
  208.  
  209.  
  210.     if ((HTT = new(pushD(getter)) HyperTextTarget
  211.         (fname,topic)) != HyperTextTargeT0)
  212.         if (!HTT->ConstructOK())  {
  213.             popD();
  214.             return HyperTextTargeT0;
  215.         }
  216.     return HTT;
  217. }
  218.  
  219. int HyperStack::setTopView(unsigned startColumn,
  220.     unsigned startRow, unsigned cursorColumn,
  221.     unsigned cursorRow)
  222. {
  223.     if (Nodes())
  224.         return ((HyperTextTargeT)topD())->setView
  225.         (startColumn,startRow,cursorColumn,cursorRow);
  226.     return 0;
  227. }
  228.